//
//  UITextView + Emoticon.swift
//  表情
//
//  Created by HOP on 16/1/1.
//  Copyright © 2016年 HOP. All rights reserved.
//

import UIKit

extension UITextView {
    /// 获取textView中带表情图片的文本
    func emoticonText() -> String {
    // 拼接之后的文本内容
    var textM = ""
        //         表情图片会分段保存在textView.attributedText里面,需要分段获取,拼接起来
                print("textView的文本:\(attributedText)")
        //         遍历属性文本的每一段
        //         attrName: 要遍历的String
        //         inRange: 范围
    attributedText.enumerateAttributesInRange(NSRange(location: 0, length: attributedText.length), options: NSAttributedStringEnumerationOptions(rawValue: 0)) { (result, range, _) -> Void in
    // 如果result 字典里面包含 NSAttachment key就是一个图片,其他情况直接截取文本
    //            print("result: \(result)")
    //            print("range: \(range)")
    //            print("--------")
    if let attachment = result["NSAttachment"] as?  HOPTextAttachment {
        // result 字典里面包含 NSAttachment key 就是一个图片,需要获取到附件图片的名称
        // 让附件里面带有图片的名称
        textM += attachment.chs!
        
        
    }else {
    // 文本,其他情况直接截取文本
    let text = (self.attributedText.string as NSString).substringWithRange(range)
        // 将截取的字符串拼接到textM后面
        //                textM = textM + text
        textM += text
    }
    
    }
   return textM
    }
    /**
     添加表情到textView里面
     
     - parameter emoticon: 要添加的表情模型
     */
    func insertEmoticon(emoticon: HOPEmoticon) {
        // 所有的表情被点击后,都会到这个方法里面来,所有在这里判断点击的是否是删除按钮
        if emoticon.removeEmoticon {
        // 删除textView中的内容(图片表情,emoji表情,普通文本)
        deleteBackward()
        
        }
        // 需要添加的表情有2种
        
        // 1.添加emoji表情
        if let emoji = emoticon.emoji {
            insertText(emoji)
            // 不需要在判断是图片表情
            return
        }
        // 2.添加图片表情
        if let pngPath = emoticon.pngPath {
            // 2.1创建附件
            let attachment = HOPTextAttachment()
            // 2.2给附件添加图片
            attachment.image = UIImage(contentsOfFile: pngPath)
            // 2.2设置附件的图片名称
            attachment.chs = emoticon.chs
            // 2.2.1设置图片的bounds
            let w = font!.lineHeight
            attachment.bounds = CGRect(x: 0, y: -(w * 0.2), width: w, height: w)
            // 2.3将附件转成可变的属性文本
            let attrText = NSMutableAttributedString(attributedString: NSAttributedString(attachment: attachment))
            // 2.3.2发现在图片后面连续添加图片,图片会变小.原因是附件缺少Font属性,给附件添加Font属性
            attrText.addAttribute(NSFontAttributeName, value: font!, range: NSRange(location: 0, length: 1))
            // 2.4获取现有的属性文本,转成可变属性文本
            let currentAttrText = NSMutableAttributedString(attributedString: attributedText)
            // 2.5获取选中位置
            let sRange = selectedRange
            // 2.6将图片替换到现有文本选中的位置
            currentAttrText.replaceCharactersInRange(sRange, withAttributedString: attrText)
            // 2.7将替换好的属性文本赋值给textView
            attributedText = currentAttrText
            // 2.8设置光标位置
            selectedRange = NSRange(location: sRange.location + 1, length: 0)
            // 2.9当添加图片表情的时候不会触发textView的文本改变事件,不会发出通知,也不会调用代理
            // 2.9.1自己来发出通知
            NSNotificationCenter.defaultCenter().postNotificationName(UITextViewTextDidChangeNotification, object: self)
            // 2.9.2自己来调用代理
            delegate?.textViewDidChange?(self)
        }
        
        
    }
}



